Kameleon-Plus  0.3.2
Cell3D.h
Go to the documentation of this file.
1 /*
2  * Cell3D.h
3  *
4  * Created on: Apr 21, 2009
5  * Author: David Berrios
6  */
7 
8 #ifndef CELL3D_H_
9 #define CELL3D_H_
10 
11 #ifdef __cplusplus
12 #include "Point.h"
13 #include <vector>
14 #include <deque>
15 #include "Vector.h"
16 
17 namespace ccmc
18 {
25  //P=positions, D=data
26  template<class P, class D>
27  class Cell3D
28  {
29  public:
30  Cell3D();
31  Cell3D(Point<P> * positions, D * vectors);
32  void setData(D * vectors);
33  void setPositions(Point<P> * positions);
34  D* getData();
35  D * getData(int i);
36  Vector<D> getDeltas();
37  Point<P> * getPositions();
38  Point<P> * getPosition(int i);
39  std::vector<int> getDataForFace(int i);
40  std::vector<std::vector<int> > getTriangles();
41  std::string toString();
42  Point<P> getCenter();
43  std::deque<Cell3D<P, D> *> getChildren();
44  D interpolateData(Point<P>& point);
45  D interpolateData(const P& c0, const P& c1, const P& c2);
46  ~Cell3D();
47 
48  private:
49  Point<P> positions[8];
50  D data[8];
51  int level;
52  float dx;
53  float dy;
54  float dz;
55  };
56 
57  template<class P, class D>
58  Cell3D<P, D>::Cell3D()
59  {
60  level = 0;
61  }
62 
63  // 6_____7
64  // /| /|
65  // 4_|___5 | 4
66  // | | | | 0 1 2 3
67  // | 2 - - 3 5
68  // |/ |/
69  // 0 - - 1
70  template<class P, class D>
71  Cell3D<P, D>::Cell3D(Point<P> positions[], D data[])
72  {
73  for (int i = 0; i < 8; i++)
74  {
75  this->data[i] = data[i];
76  this->positions[i] = positions[i];
77  }
78 
79  dx = abs(positions[0].c0() - positions[1].c0());
80  dy = abs(positions[0].c1() - positions[4].c1());
81  dz = abs(positions[0].c2() - positions[2].c2());
82  }
83 
84  template<class P, class D>
85  void Cell3D<P, D>::setData(D data[])
86  {
87  for (int i = 0; i < 8; i++)
88  {
89  this->data[i] = data[i];
90  }
91  }
92 
93  template<class P, class D>
94  void Cell3D<P, D>::setPositions(Point<P> positions[])
95  {
96  for (int i = 0; i < 8; i++)
97  {
98  this->positions[i] = positions[i];
99  }
100 
101  dx = abs(positions[0].c0() - positions[1].c0());
102  dy = abs(positions[0].c1() - positions[4].c1());
103  dz = abs(positions[0].c2() - positions[2].c2());
104  }
105 
106  template<class P, class D>
107  D* Cell3D<P, D>::getData()
108  {
109  return data;
110  }
111 
112  template<class P, class D>
113  D* Cell3D<P, D>::getData(int i)
114  {
115  return &data[i];
116  }
117 
118  // 6_____7
119  // /| /|
120  // 4_|___5 | 4
121  // | | | | 0 1 2 3
122  // | 2 - - 3 5
123  // |/ |/
124  // 0 - - 1
125  template<class P, class D>
126  std::vector<int> Cell3D<P, D>::getDataForFace(int i)
127  {
128  std::vector<int> dataOnFace = std::vector<int>(4);
129 
130  switch (i)
131  {
132  case 0:
133  dataOnFace[0] = 0;
134  dataOnFace[1] = 1;
135  dataOnFace[2] = 4;
136  dataOnFace[3] = 5;
137  break;
138  case 1:
139  dataOnFace[0] = 1;
140  dataOnFace[1] = 3;
141  dataOnFace[2] = 5;
142  dataOnFace[3] = 7;
143  break;
144  case 2:
145  dataOnFace[0] = 3;
146  dataOnFace[1] = 2;
147  dataOnFace[2] = 7;
148  dataOnFace[3] = 6;
149  break;
150  case 3:
151  dataOnFace[0] = 2;
152  dataOnFace[1] = 0;
153  dataOnFace[2] = 6;
154  dataOnFace[3] = 4;
155  break;
156  case 4:
157  dataOnFace[0] = 4;
158  dataOnFace[1] = 5;
159  dataOnFace[2] = 6;
160  dataOnFace[3] = 7;
161  break;
162  case 5:
163  dataOnFace[0] = 2;
164  dataOnFace[1] = 3;
165  dataOnFace[2] = 0;
166  dataOnFace[3] = 1;
167  break;
168 
169  }
170  return dataOnFace;
171  }
172 
177  template<class P, class D>
178  std::vector<std::vector<int> > Cell3D<P, D>::getTriangles()
179  {
180  // 2______3
181  // | /|
182  // | / |
183  // | / |
184  // | / |
185  // | / |
186  // |/_____|
187  // 0 1
188 
189  // get vectors B1, B2, B3, and B4 - b1, b2, b3 and B2, B4, B3
190  // B1 = v[1]
191  // B2 = v[3]
192  // B3 = v[0]
193  // B4 = v[2]
194  std::vector<std::vector<int> > triangles = std::vector<std::vector<int> >(12);
195  for (int i = 0; i < 12; i++)
196  {
197  triangles[i] = std::vector<int>(3);
198  }
199  //[12][3];
200 
201  for (int i = 0; i < 6; i++)
202  {
203  std::vector<int> dataOnFace = getDataForFace(i);
204 
205  int i2 = i * 2;
206  int i21 = i2 + 1;
207  triangles[i2][0] = dataOnFace[1];
208  triangles[i2][1] = dataOnFace[3];
209  triangles[i2][2] = dataOnFace[0];
210 
211  triangles[i21][0] = dataOnFace[3];
212  triangles[i21][1] = dataOnFace[2];
213  triangles[i21][2] = dataOnFace[0];
214  }
215  return triangles;
216 
217  }
218 
219  /*template<class P, class D>
220  Cell3D_struct Cell3D<P, D>::getStruct()
221  {
222  Cell3D_struct cStruct;
223  for (int i = 0; i < 8; i++)
224  {
225  cStruct.positions[i].x = positions[i].c0();
226  cStruct.positions[i].y = positions[i].c1();
227  cStruct.positions[i].z = positions[i].c2();
228 
229  cStruct.vectors[i].x = vectors[i].c0();
230  cStruct.vectors[i].y = vectors[i].c1();
231  cStruct.vectors[i].z = vectors[i].c2();
232 
233  }
234 
235  std::vector<std::vector<int> > triangles = std::vector<std::vector<int> >(12);
236  triangles = getTriangles();
237 
238  for (int i = 0; i < triangles.size(); i++)
239  {
240  cStruct.triangles[i].x = triangles[i][0];
241  cStruct.triangles[i].y = triangles[i][1];
242  cStruct.triangles[i].z = triangles[i][2];
243  }
244 
245  return cStruct;
246  }*/
247 
248  // 6_____7
249  // /| /|
250  // 4_|___5 | 4
251  // | | | | 0 1 2 3
252  // | 2 - - 3 5
253  // |/ |/
254  // 0 - - 1
255 
256  template<class P, class D>
257  std::string Cell3D<P, D>::toString()
258  {
259  Point<P> center = getCenter();
260  return center.toString();
261 
262  }
263 
264  template<class P, class D>
265  Point<P> Cell3D<P, D>::getCenter()
266  {
267  Point<P> center;
268  float x = (positions[0].c0() + positions[1].c0()) / 2.0f;
269  float y = (positions[0].c1() + positions[4].c1()) / 2.0f;
270  float z = (positions[0].c2() + positions[2].c2()) / 2.0f;
271  center.setComponents(x, y, z);
272  return center;
273  }
274 
275  template<class P, class D>
276  std::deque<Cell3D<P, D> *> Cell3D<P, D>::getChildren()
277  {
278  std::deque<Cell3D<P, D> *> cells = std::deque<Cell3D<P, D> *>(8);
279  ;
280 
281  Cell3D<P, D> * c0 = new Cell3D<P, D> ();
282  Cell3D<P, D> * c1 = new Cell3D<P, D> ();
283  Cell3D<P, D> * c2 = new Cell3D<P, D> ();
284  Cell3D<P, D> * c3 = new Cell3D<P, D> ();
285  Cell3D<P, D> * c4 = new Cell3D<P, D> ();
286  Cell3D<P, D> * c5 = new Cell3D<P, D> ();
287  Cell3D<P, D> * c6 = new Cell3D<P, D> ();
288  Cell3D<P, D> * c7 = new Cell3D<P, D> ();
289 
290  // float dx = Math.abs(positions[0].c0() - positions[1].c0());
291  // float dy = Math.abs(positions[0].c1() - positions[4].c1());
292  // float dz = Math.abs(positions[0].c2() - positions[2].c2());
293 
294  Point<D> p = positions[0];
295  Point<D> cPositions0[] = { Point<D> (p.c0(), p.c1(), p.c2()), Point<D> (p.c0() + dx * .5f, p.c1(), p.c2()),
296  Point<D> (p.c0(), p.c1(), p.c2() + dz * .5f), Point<D> (p.c0() + dx * .5f, p.c1(), p.c2() + dz * .5f),
297  Point<D> (p.c0(), p.c1() + .5f * dy, p.c2()), Point<D> (p.c0() + .5f * dx, p.c1() + .5f * dy, p.c2()),
298  Point<D> (p.c0(), p.c1() + .5f * dy, p.c2() + dz * .5f), Point<D> (p.c0() + .5f * dx,
299  p.c1() + .5f * dy, p.c2() + dz * .5f) };
300  c0->setPositions(cPositions0);
301 
302  Point<D> cPositions1[] = { Point<D> (p.c0() + dx * .5f, p.c1(), p.c2()),
303  Point<D> (p.c0() + dx, p.c1(), p.c2()), Point<D> (p.c0() + dx * .5f, p.c1(), p.c2() + dz * .5f), Point<
304  D> (p.c0() + dx, p.c1(), p.c2() + dz * .5f), Point<D> (p.c0() + dx * .5f, p.c1() + dy * .5f,
305  p.c2()), Point<D> (p.c0() + dx, p.c1() + dy * .5f, p.c2()), Point<D> (p.c0() + dx * .5f, p.c1()
306  + dy * .5f, p.c2() + dz * .5f), Point<D> (p.c0() + dx, p.c1() + dy * .5f, p.c2() + dz * .5f) };
307  c1->setPositions(cPositions1);
308 
309  Point<D> cPositions2[] = { Point<D> (p.c0() + dx * .5f, p.c1(), p.c2() + dz * .5f), Point<D> (p.c0() + dx,
310  p.c1(), p.c2() + dz * .5f), Point<D> (p.c0() + dx * .5f, p.c1(), p.c2() + dz), Point<D> (p.c0() + dx,
311  p.c1(), p.c2() + dz), Point<D> (p.c0() + dx * .5f, p.c1() + dy * .5f, p.c2() + dz * .5f), Point<D> (
312  p.c0() + dx, p.c1() + dy * .5f, p.c2() + dz * .5f), Point<D> (p.c0() + dx * .5f, p.c1() + dy * .5f,
313  p.c2() + dz), Point<D> (p.c0() + dx, p.c1() + dy * .5f, p.c2() + dz) };
314  c2->setPositions(cPositions2);
315 
316  Point<D> cPositions3[] = { Point<D> (p.c0(), p.c1(), p.c2() + dz * .5f), Point<D> (p.c0() + dx * .5f, p.c1(),
317  p.c2() + dz * .5f), Point<D> (p.c0(), p.c1(), p.c2() + dz), Point<D> (p.c0() + dx * .5f, p.c1(), p.c2()
318  + dz), Point<D> (p.c0(), p.c1() + .5f * dy, p.c2() + dz * .5f), Point<D> (p.c0() + .5f * dx, p.c1()
319  + .5f * dy, p.c2() + dz * .5f), Point<D> (p.c0(), p.c1() + .5f * dy, p.c2() + dz), Point<D> (p.c0()
320  + .5f * dx, p.c1() + .5f * dy, p.c2() + dz) };
321  c3->setPositions(cPositions3);
322 
323  Point<D> cPositions4[] = { Point<D> (p.c0(), p.c1() + dy * .5f, p.c2()), Point<D> (p.c0() + dx * .5f, p.c1()
324  + dy * .5f, p.c2()), Point<D> (p.c0(), p.c1() + dy * .5f, p.c2() + dz * .5f), Point<D> (p.c0() + dx
325  * .5f, p.c1() + dy * .5f, p.c2() + dz * .5f), Point<D> (p.c0(), p.c1() + dy, p.c2()), Point<D> (p.c0()
326  + .5f * dx, p.c1() + dy, p.c2()), Point<D> (p.c0(), p.c1() + dy, p.c2() + dz * .5f), Point<D> (p.c0()
327  + .5f * dx, p.c1() + dy, p.c2() + dz * .5f) };
328  c4->setPositions(cPositions4);
329 
330  Point<D> cPositions5[] = { Point<D> (p.c0() + dx * .5f, p.c1() + dy * .5f, p.c2()), Point<D> (p.c0() + dx,
331  p.c1() + dy * .5f, p.c2()), Point<D> (p.c0() + dx * .5f, p.c1() + dy * .5f, p.c2() + dz * .5f),
332  Point<D> (p.c0() + dx, p.c1() + dy * .5f, p.c2() + dz * .5f), Point<D> (p.c0() + dx * .5f, p.c1() + dy,
333  p.c2()), Point<D> (p.c0() + dx, p.c1() + dy, p.c2()), Point<D> (p.c0() + dx * .5f, p.c1() + dy,
334  p.c2() + dz * .5f), Point<D> (p.c0() + dx, p.c1() + dy, p.c2() + dz * .5f) };
335  c5->setPositions(cPositions5);
336 
337  Point<D> cPositions6[] = { Point<D> (p.c0() + dx * .5f, p.c1() + dy * .5f, p.c2() + dz * .5f), Point<D> (p.c0()
338  + dx, p.c1() + dy * .5f, p.c2() + dz * .5f), Point<D> (p.c0() + dx * .5f, p.c1() + dy * .5f, p.c2()
339  + dz), Point<D> (p.c0() + dx, p.c1() + dy * .5f, p.c2() + dz), Point<D> (p.c0() + dx * .5f,
340  p.c1() + dy, p.c2() + dz * .5f), Point<D> (p.c0() + dx, p.c1() + dy, p.c2() + dz * .5f), Point<D> (
341  p.c0() + dx * .5f, p.c1() + dy, p.c2() + dz), Point<D> (p.c0() + dx, p.c1() + dy, p.c2() + dz) };
342  c6->setPositions(cPositions6);
343 
344  Point<D> cPositions7[] = { Point<D> (p.c0(), p.c1() + dy * .5f, p.c2() + dz * .5f), Point<D> (
345  p.c0() + dx * .5f, p.c1() + dy * .5f, p.c2() + dz * .5f), Point<D> (p.c0(), p.c1() + dy * .5f, p.c2()
346  + dz), Point<D> (p.c0() + dx * .5f, p.c1() + dy * .5f, p.c2() + dz), Point<D> (p.c0(), p.c1() + dy,
347  p.c2() + dz * .5f), Point<D> (p.c0() + .5f * dx, p.c1() + dy, p.c2() + dz * .5f), Point<D> (p.c0(),
348  p.c1() + dy, p.c2() + dz), Point<D> (p.c0() + .5f * dx, p.c1() + dy, p.c2() + dz) };
349  c7->setPositions(cPositions7);
350 
351  D cData0[] = { interpolateData(c0->getPositions()[0]), interpolateData(c0->getPositions()[1]), interpolateData(
352  c0->getPositions()[2]), interpolateData(c0->getPositions()[3]), interpolateData(c0->getPositions()[4]),
353  interpolateData(c0->getPositions()[5]), interpolateData(c0->getPositions()[6]), interpolateData(
354  c0->getPositions()[7]) };
355  c0->setData(cData0);
356 
357  // derived.loadVectorVariable("b");
358  // for (int i = 0; i < positions.length; i++)
359  // {
360  //
361  // Vector3f kameleonValue = new Vector3f(
362  // derived.interpolate("bx", c1.getPositions()[i].c0(), c1.getPositions()[i].c1(), c1.getPositions()[i].c2()),
363  // derived.interpolate("by", c1.getPositions()[i].c0(), c1.getPositions()[i].c1(), c1.getPositions()[i].c2()),
364  // derived.interpolate("bz", c1.getPositions()[i].c0(), c1.getPositions()[i].c1(), c1.getPositions()[i].c2()));
365  // //if (Math.abs(kameleonValue.length() - c1.getVectors()[i].length()) >.001)
366  // System.out.println("cposition: " + c1.getPositions()[i] + " vectors: " + c1.getVectors()[i] + " kameleonv: " + kameleonValue);
367  // }
368 
369  D cData1[] = { interpolateData(c1->getPositions()[0]), interpolateData(c1->getPositions()[1]), interpolateData(
370  c1->getPositions()[2]), interpolateData(c1->getPositions()[3]), interpolateData(c1->getPositions()[4]),
371  interpolateData(c1->getPositions()[5]), interpolateData(c1->getPositions()[6]), interpolateData(
372  c1->getPositions()[7]) };
373  c1->setData(cData1);
374 
375  D cData2[] = { interpolateData(c2->getPositions()[0]), interpolateData(c2->getPositions()[1]), interpolateData(
376  c2->getPositions()[2]), interpolateData(c2->getPositions()[3]), interpolateData(c2->getPositions()[4]),
377  interpolateData(c2->getPositions()[5]), interpolateData(c2->getPositions()[6]), interpolateData(
378  c2->getPositions()[7]) };
379  c2->setData(cData2);
380 
381  D cData3[] = { interpolateData(c3->getPositions()[0]), interpolateData(c3->getPositions()[1]), interpolateData(
382  c3->getPositions()[2]), interpolateData(c3->getPositions()[3]), interpolateData(c3->getPositions()[4]),
383  interpolateData(c3->getPositions()[5]), interpolateData(c3->getPositions()[6]), interpolateData(
384  c3->getPositions()[7]) };
385  c3->setData(cData3);
386 
387  D cData4[] = { interpolateData(c4->getPositions()[0]), interpolateData(c4->getPositions()[1]), interpolateData(
388  c4->getPositions()[2]), interpolateData(c4->getPositions()[3]), interpolateData(c4->getPositions()[4]),
389  interpolateData(c4->getPositions()[5]), interpolateData(c4->getPositions()[6]), interpolateData(
390  c4->getPositions()[7]) };
391  c4->setData(cData4);
392 
393  D cData5[] = { interpolateData(c5->getPositions()[0]), interpolateData(c5->getPositions()[1]), interpolateData(
394  c5->getPositions()[2]), interpolateData(c5->getPositions()[3]), interpolateData(c5->getPositions()[4]),
395  interpolateData(c5->getPositions()[5]), interpolateData(c5->getPositions()[6]), interpolateData(
396  c5->getPositions()[7]) };
397  c5->setData(cData5);
398 
399  D cData6[] = { interpolateData(c6->getPositions()[0]), interpolateData(c6->getPositions()[1]), interpolateData(
400  c6->getPositions()[2]), interpolateData(c6->getPositions()[3]), interpolateData(c6->getPositions()[4]),
401  interpolateData(c6->getPositions()[5]), interpolateData(c6->getPositions()[6]), interpolateData(
402  c6->getPositions()[7]) };
403  c6->setData(cData6);
404 
405  D cData7[] = { interpolateData(c7->getPositions()[0]), interpolateData(c7->getPositions()[1]), interpolateData(
406  c7->getPositions()[2]), interpolateData(c7->getPositions()[3]), interpolateData(c7->getPositions()[4]),
407  interpolateData(c7->getPositions()[5]), interpolateData(c7->getPositions()[6]), interpolateData(
408  c7->getPositions()[7]) };
409  c7->setData(cData7);
410 
411  cells[0] = c0;
412  cells[1] = c1;
413  cells[2] = c2;
414  cells[3] = c3;
415  cells[4] = c4;
416  cells[5] = c5;
417  cells[6] = c6;
418  cells[7] = c7;
419 
420  // System.out.println("children.");
421  // for (int i = 0; i < children.length; i++)
422  // {
423  // System.out.println("deltas: " + children[i].getDeltas().length());
424  // }
425 
426 
427  return cells;
428  }
429 
430  template<class P, class D>
431  D Cell3D<P, D>::interpolateData(Point<P>& point)
432  {
433  return interpolateData(point.c0(), point.c1(), point.c2());
434  }
435 
436  template<class P, class D>
437  D Cell3D<P, D>::interpolateData(const P& c0, const P& c1, const P& c2)
438  {
439  D m_x = (c0 - positions[0].c0()) / dx;
440  D m_y = (c1 - positions[0].c1()) / dy;
441  D m_z = (c2 - positions[0].c2()) / dz;
442  //System.out.println("m_x: " + m_x + " m_y: " + m_y + " m_z: " + m_z);
443 
444  D vc1 = (1 - m_x) * data[0] + m_x * data[1];
445  D vc2 = (1 - m_x) * data[4] + m_x * data[5];
446  D vc3 = (1 - m_x) * data[2] + m_x * data[3];
447  D vc4 = (1 - m_x) * data[6] + m_x * data[7];
448  D vc5 = (1 - m_z) * vc1 + m_z * vc3;
449  D vc6 = (1 - m_z) * vc2 + m_z * vc4;
450  D xc = (1 - m_y) * vc5 + m_y * vc6;
451 
452  return xc;
453  }
454 
455  template<class P, class D>
456  Point<P> * Cell3D<P, D>::getPositions()
457  {
458  return positions;
459  }
460 
461  template<class P, class D>
462  Point<P> * Cell3D<P, D>::getPosition(int i)
463  {
464  return &(positions[i]);
465  }
466 
467  template<class P, class D>
468  Vector<D> Cell3D<P, D>::getDeltas()
469  {
470  return Vector<D> (dx, dy, dz);
471  }
472 
473  template<class P, class D>
474  Cell3D<P, D>::~Cell3D()
475  {
476  }
477 
478 }
479 #endif /* __cplusplus */
480 #endif /* CELL3D_H_ */